package cn.z2huo.knowledge.reflect.clazz;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;

/**
 * <p>
 *
 * @author z2huo
 */
class IsAssignableFromTest {

    static void stringTest() {
        String string = "aaa";
        System.out.println(string.getClass().isAssignableFrom(String.class));
        System.out.println();
    }

    static void listTest() {
        List<String> list = new ArrayList<>();
        list.add("1");
        list.add("2");
        System.out.println(list.getClass().isAssignableFrom(ArrayList.class));

        // 具体来说，该方法测试的是：
        // 是否可以通过身份转换（identity conversion） 或 扩展引用转换（widening reference conversion）
        // 将指定的 Class 参数所表示的类型转换为当前 Class 对象所表示的类型。
        System.out.println(list.getClass().isAssignableFrom(List.class));
        System.out.println(List.class.isAssignableFrom(list.getClass()));

        System.out.println(list instanceof List<String>);
        System.out.println(list instanceof List);
        System.out.println(list instanceof ArrayList<String>);
        System.out.println(list instanceof ArrayList);
        System.out.println();

        List<String> list2 = List.of("a", "b");
        System.out.println(list2.getClass().isAssignableFrom(List.class));
    }

    static void mapTest() {
        HashMap<String, String> map = new HashMap<>();
        map.put("1", "1");
        map.put("2", "2");

        LinkedHashMap<String, String> map2 = new LinkedHashMap<>();
        map2.put("1", "1");
        map2.put("2", "2");

        System.out.println(map);
        System.out.println(map2);
        System.out.println();

        System.out.println(HashMap.class.isAssignableFrom(map2.getClass()));
        HashMap<String, String> map3 = (HashMap<String, String>) map2;
        System.out.println(map3);
        System.out.println();

        System.out.println(LinkedHashMap.class.isAssignableFrom(map.getClass()));
        // class java.util.HashMap cannot be cast to class java.util.LinkedHashMap
        LinkedHashMap<String, String> map4 = (LinkedHashMap<String, String>) map;
        System.out.println(map4);
    }

    public static void main(String[] args) {
        stringTest();

        listTest();

        mapTest();
    }
}
